using Microsoft.Extensions.Logging;
using TaskScheduler.Core;

namespace TaskScheduler.Tasks;

/// <summary>
/// 数据同步示例任务
/// 模拟从外部API获取数据并同步到数据库
/// </summary>
public class DataSyncTask : ITask
{
    private readonly ILogger<DataSyncTask> _logger;
    private readonly IHttpClientFactory _httpClientFactory;

    public DataSyncTask(
        ILogger<DataSyncTask> logger,
        IHttpClientFactory httpClientFactory)
    {
        _logger = logger;
        _httpClientFactory = httpClientFactory;
    }

    public string TaskName => "DataSyncTask";
    public string Description => "数据同步任务 - 每天凌晨2点执行";
    public bool IsEnabled => true;
    public string CronExpression => "0 2 * * *"; // 每天凌晨2点执行

    public async Task<TaskResult> ExecuteAsync(CancellationToken cancellationToken = default)
    {
        try
        {
            _logger.LogInformation("开始数据同步任务...");

            // 1. 从外部API获取数据
            var data = await FetchDataFromApiAsync(cancellationToken);
            _logger.LogInformation("从API获取了 {Count} 条数据", data.Count);

            // 2. 数据处理
            var processedData = ProcessData(data);
            _logger.LogInformation("数据处理完成，有效数据 {Count} 条", processedData.Count);

            // 3. 保存到数据库
            await SaveToDatabase(processedData, cancellationToken);
            _logger.LogInformation("数据已保存到数据库");

            return new TaskResult
            {
                IsSuccess = true,
                Message = $"数据同步成功，共同步 {processedData.Count} 条数据"
            };
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "数据同步任务执行失败");
            return new TaskResult
            {
                IsSuccess = false,
                Message = ex.Message,
                Exception = ex
            };
        }
    }

    /// <summary>
    /// 从API获取数据（示例）
    /// </summary>
    private async Task<List<string>> FetchDataFromApiAsync(CancellationToken cancellationToken)
    {
        // 这里是示例代码，实际使用时需要替换为真实的API调用
        await Task.Delay(500, cancellationToken);
        
        // 模拟返回的数据
        return new List<string>
        {
            "Data Item 1",
            "Data Item 2",
            "Data Item 3"
        };
    }

    /// <summary>
    /// 数据处理（示例）
    /// </summary>
    private List<string> ProcessData(List<string> data)
    {
        // 这里是示例代码，实际使用时需要根据业务需求处理数据
        return data.Where(d => !string.IsNullOrWhiteSpace(d)).ToList();
    }

    /// <summary>
    /// 保存到数据库（示例）
    /// </summary>
    private async Task SaveToDatabase(List<string> data, CancellationToken cancellationToken)
    {
        // 这里是示例代码，实际使用时需要使用真实的数据库操作
        await Task.Delay(200, cancellationToken);
        _logger.LogInformation("模拟保存数据到数据库...");
    }
}

